package com.scsystem.xysc.util;

import lombok.Data;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author sky
 * @date: 2023/5/7 22:23
 */

@Data
public class DateTimeFormatUtil {

    private String start;
    private String end;


    /**
     * Date转为LocalDateTime
     * @param date Date日期
     * @return LocalDateTime转换后的日期
     */
    public static LocalDateTime DateToLocalDateTime(Date date) {
        // 转为时间戳
        Instant instant = date.toInstant();
        // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * localDateTime转为Date
     * @param localDateTime LocalDateTime日期
     * @return Date转换后的日期
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        // 将此日期时间与时区相结合以创建 ZonedDateTime
        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
        // 本地时间线LocalDateTime到即时时间线Instant时间戳
        Instant instant = zonedDateTime.toInstant();
        // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
        return Date.from(instant);
    }

    /**
     * 将 yyyy-MM-dd HH:mm:ss 转换为 yyyy-MM-dd
     *
     * @return String
     */
    public static String dateTimeFormatConversion(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(date);
    }

    /**
     * 将字符串日期转换为Date类型
     *
     * @param date 字符串日期
     * @return Date
     * @throws ParseException 参数解析异常
     */
    public static Date getDateSpringFormatDate(String date) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.parse(date);
    }


    /**
     * 获取指定日的开始和结束时间
     *
     * @return DateTimeFormatUtil
     */
    public static DateTimeFormatUtil getsTheStartAndEndTimesForTheSpecifiedDay(Date date) {
        DateTimeFormatUtil dateTimeFormatUtil = new DateTimeFormatUtil();
        // 将Date转换为LocalDate
        LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        dateTimeFormatUtil.setStart(LocalDateTime.of(localDate, LocalTime.MIN)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        dateTimeFormatUtil.setEnd(LocalDateTime.of(localDate, LocalTime.MAX)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        return dateTimeFormatUtil;
    }

    /**
     * 获取指定月的开始和结束时间
     *
     * @param date 指定日期
     * @return DateTimeFormatUtil
     */
    public static DateTimeFormatUtil getsTheStartAndEndTimesOfTheSpecifiedMonth(Date date) {
        DateTimeFormatUtil dateTimeFormatUtil = new DateTimeFormatUtil();
        // 将 Date 对象转换为 LocalDateTime 对象
        LocalDateTime specifiedDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
        // 获取指定时间所在的年月
        YearMonth specifiedYearMonth = YearMonth.from(specifiedDateTime);
        // 获取当月的开始时间（即当月的第一天的零点）
        dateTimeFormatUtil.setStart(specifiedYearMonth.atDay(1)
                .atTime(LocalTime.MIN).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        // 获取当月的结束时间（即当月的最后一天的23:59:59）
        LocalDate lastDayOfMonth = specifiedYearMonth.atEndOfMonth();
        dateTimeFormatUtil.setEnd(lastDayOfMonth.atTime(LocalTime.MAX)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        return dateTimeFormatUtil;
    }

    /**
     * 获取指定年的开始和结束时间
     *
     * @param date 指定日期
     * @return DateTimeFormatUtil
     */
    public static DateTimeFormatUtil getsTheStartAndEndTimesForTheSpecifiedYear(Date date) {
        DateTimeFormatUtil dateTimeFormatUtil = new DateTimeFormatUtil();
        // 将 Date 对象转换为 LocalDateTime 对象
        LocalDateTime specifiedDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
        // 获取指定时间所在的年份
        Year specifiedYear = Year.from(specifiedDateTime);
        // 获取当年的开始时间（即当年的第一天的零点）
        dateTimeFormatUtil.setStart(specifiedYear.atDay(1).atTime(LocalTime.MIN)
                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        // 获取当年的结束时间（即当年的最后一天的23:59:59）
        LocalDate lastDayOfYear = specifiedYear.atMonth(12).atEndOfMonth();
        dateTimeFormatUtil.setEnd(lastDayOfYear.atTime(LocalTime.MAX)
                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

        return dateTimeFormatUtil;
    }

    /**
     * 获取指定时间的周的开始和结束时间
     *
     * @param date 指定日期
     * @return DateTimeFormatUtil
     */
    public static DateTimeFormatUtil getsTheStartAndEndTimesOfTheSpecifiedWeek(Date date) {
        DateTimeFormatUtil dateTimeFormatUtil = new DateTimeFormatUtil();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
        LocalDateTime startOfWeek = localDateTime.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
        LocalDateTime endOfWeek = localDateTime.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
        dateTimeFormatUtil.setStart(startOfWeek.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        dateTimeFormatUtil.setEnd(endOfWeek.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        return dateTimeFormatUtil;
    }
}
